fn main() {

    /*
    String 是一个堆分配的可变字符串类型
    &str是指字符串的切片引用，是在栈上分配的，而且是不可变引用
    */

    /*
    区别:

        1.String具有所有权，&str不具备所有权
        2.结构体中尽量使用String,如果使用&str要显式的声明生命周期
        3.函数参数推荐使用&str(如果不想交出所有权)

    */


    // 相互转换
    let name = String::from("zhangsan");
    let _course = "Rust".to_owned();   // 字面量转为String
    let _course1 = "Rust".to_string(); // 字面量转为String


    let new_name = name.replace("a","b");
    println!("new name is:{}", new_name);

    // 字面量可直接打印ascii值
    let rust = "\x52";
    println!("{rust}");   // R


    let color = "green";
    let name = "Frank".to_string();

    let _p = Person {
        name: name,
        color: color,
        age:24,
    };

    let arg1 = "value".to_string();
    let arg2 = "value";
    printx(&arg1);
    printy(&arg1);

}

// 表明字面量的生命周期和结构体的生命周期一样
struct Person<'a> {
    name: String,
    color: &'a str,   // 必须手动标注生命周期
    age: i32,
}


// 可以传 &str和&String, 引用的生命周期与函数一致
fn printx<'a>(data: &'a str) {
    println!("{}",data);
}

// 能传 &String
fn  printy<'a>(data: &'a String){
    println!("{}",data);
}